// 认证相关的api封装
// 在这里封装和后端交互的API接口，一般是由后端提供接口文档，这里适配

// 引入axios & AxiosResponse
import axios from 'axios'
import type { AxiosResponse } from 'axios'

// 声明访问地址和超时时间
const api = axios.create({
  // 接口地址 -> 后端服务地址, 如果使用代理，则不需要配置baseURL
  // baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000/api',
  timeout: 5000
})

// 定义登录的数据结构 - 用户名和密码
interface LoginData {
  username: string
  password: string
}

// 注册的数据结构 - 用户名、邮箱和密码
interface RegisterData {
  username: string
  email: string
  password: string
}

// 登录的响应结构, 包含 token 和用户信息
interface LoginResponse {
  data: {
    token: string
    userInfo: {
      username: string
      email: string
      id : number
      password: string
      phone: string | null
      salt: string
      avatar: string | null
      status: number
      createTime: string
      updateTime: string
    }
  }
}

// 登录接口
// 请求参数是LoginData（username & password）
// 响应结构是LoginResponse（token & user），异步相应Promise<LoginResponse>
export const login = (data: LoginData): Promise<AxiosResponse<LoginResponse>> => {
  // 通过axios发送请求，返回登录结果
  return api.post('api/auth/login', data)
}

// 注册接口
// 请求参数是RegisterData（username & email & password）
// 响应结构是void，异步响应Promise<void>
export const register = (data: RegisterData): Promise<AxiosResponse<void>> => {
  // 通过axios发送请求，返回注册结果
  return api.post('api/auth/register', data)
}

// 添加请求拦截器
api.interceptors.request.use(
  (config) => {
    // 从本地存储获取 token， 如果有token, 放到header中的Authorization中
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  // 错误处理，如果没有token，则跳转到登录页面
  (error) => {
    return Promise.reject(error)
  }
)

// 添加响应拦截器
api.interceptors.response.use(
  // 如果有相应结果，返回结果
  (response) => {
    return response
  },
  // 如果是上面的错误 && 错误是401，则跳转到登录页面， 其他错误继续处理
  (error) => {
    if (error.response?.status === 401) {
      // 处理未授权情况
      localStorage.removeItem('token')
      window.location.href = '/login'
    }
    return Promise.reject(error)
  }
)

export default api
